package com.spzx.product.api;

import com.spzx.common.core.constant.SecurityConstants;
import com.spzx.common.core.constant.ServiceNameConstants;
import com.spzx.common.core.domain.R;
import com.spzx.product.api.domain.vo.CategoryVo;
import com.spzx.product.api.factory.RemoteCategoryFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;

import java.util.List;

/**
 * 商品服务
 */
@FeignClient(contextId = "remoteCategoryService",
        value = ServiceNameConstants.PRODUCT_SERVICE,
        fallbackFactory = RemoteCategoryFallbackFactory.class
)
public interface RemoteCategoryService {

    /**
     * 声明远程接口：与远程接口controller的方法声明一致
     * 涉及问题：如何携带请求头。
     * 1.远程接口声明@InnerAuth注解，切面需要提供请求头：‘from-source‘ 值必须是‘inner’
     * 在调用远程接口时声明携带我们请求头即可。
     * 携带一个请求头信息：@RequestHeader(SecurityConstants.FROM_SOURCE) String source
     * 携带多个请求头信息：Map、MultiValueMap、HttpHeaders，详见@RequestHeader类注释
     * 2.携带全局头信息
     * OpenFeign远程调用，会丢失请求头。如果还需要携带请求头，可以使用feign.RequestInterceptor接口（openFeign组件提供）开发实现类，进行信息拦截，挂请求头。
     */

    /**
     * 获取一级分类
     * @param source
     * @return
     */
    @GetMapping("/category/getOneCategory")
    public R<List<CategoryVo>> getOneCategory(@RequestHeader(SecurityConstants.FROM_SOURCE) String source);


    /**
     * 获取三级分类（立即加载）
     * @param source
     * @return
     */
    @GetMapping("/category/tree")
    public R<List<CategoryVo>> tree(@RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
